!**********************************************************************
!                      routine du produit scalaire
!**********************************************************************
SUBROUTINE PRODUITSCALAIRE(X,Y,n,R)!
!     	Arguments
!       R : OUT : Réel résultat du produit scalaire
!       X, Y : IN : vecteurs
!
 implicit none
 INTEGER n, i
 DOUBLE PRECISION, INTENT(OUT) :: R 
 DOUBLE PRECISION, INTENT(IN), DIMENSION(n) :: X, Y
!
 R = 0
 DO i = 1,n
   R = R + X(i)*Y(i)
 ENDDO
!
RETURN
!
END SUBROUTINE
!**********************************************************************
!                 routine du produit matrice vecteur
!**********************************************************************
SUBROUTINE produitmatricevecteur(A,u,n,m,R)!
! 		Arguments
!   	R : OUT : Vecteur résultat du produit matrice vecteur
!   	A : IN : matrice
!   	u : IN : vecteur
!   	m,n : IN : entiers, dimension de A
!
! compteur qui permet de compter dans quel bloc on est,
! et permet de savoir sur quelle ligne on travaille
 implicit none
 INTEGER ligne, bloc, n, m
 DOUBLE PRECISION, DIMENSION(5), INTENT(IN) :: A
 DOUBLE PRECISION, DIMENSION(n*n), INTENT(OUT) :: R
 DOUBLE PRECISION, DIMENSION(n*n), INTENT(IN) :: u
! Ce n'est pas le produit habituel, il est adapte au format des matrices du projet
! Calcul du premier element
 R(1) = A(1)*u(n+1) + A(2)*u(2) + A(3)*u(1)
! Calcul du dernier element
 R(n*n) = A(4)*u(n*n-1) + A(5)*u(n*(n-1)) + A(3)*u(n*n)
! Calcul du premier bloc
 DO ligne = 2,n
	R(ligne) = A(1)*u(n+ligne) + A(2)*u(ligne+1) + A(4)*u(ligne-1) + A(3)*u(ligne)
 ENDDO
! Calcul du dernier bloc
 DO ligne = 2,n
	R(n*(n-1)+ligne) = A(2)*u((n-1)*n+ligne+1) + A(4)*u((n-1)*n+ligne-1) + A(5)*u((n-2)*n+ligne) + A(3)*u(n*(n-1)+ligne)
 ENDDO
! Calcul general pour tous les autres blocs
 DO bloc = 1,(n-2)
	DO ligne = 2,(n-1)
		R(bloc*n + ligne) = A(1)*u((bloc+1)*n+ligne) + A(2)*u(bloc*n+ligne+1) + A(4)*u(bloc*n+ligne-1) &
		& + A(5)*u((bloc-1)*n+ligne) + A(3)*u(bloc*n + ligne)
	ENDDO
 ENDDO
!
RETURN
!
END SUBROUTINE
!**********************************************************************
!                 routine de la combinaison linéaire
!**********************************************************************
SUBROUTINE COMBINAISONLINEAIRE(n,alpha,x,beta,y,z)!
! 		Arguments
!   	z : OUT : Vecteur résultat le la combinaison linéaire
!   	x,y : IN : vecteurs d'entrée
!   	alpha, beta : IN : coefficients
!    	n : IN : dimension
!
 implicit none
 INTEGER i, n
 DOUBLE PRECISION, INTENT(IN) :: alpha, beta
 DOUBLE PRECISION, DIMENSION(n), INTENT(IN) :: x, y
 DOUBLE PRECISION, DIMENSION(n), INTENT(OUT) :: z
!
 DO i = 1,n
   z(i) = alpha*x(i)+beta*y(i)
 ENDDO
!
RETURN
!
END SUBROUTINE
